package pl.edu.pk.psb.bc.dao;

import java.util.List;

import org.hibernate.Criteria;
import org.hibernate.Query;
import org.hibernate.SessionFactory;
import org.hibernate.criterion.Restrictions;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Repository;

import pl.edu.pk.psb.bc.ds.CenaDs;
import pl.edu.pk.psb.bc.ds.MiastoDs;
import pl.edu.pk.psb.bc.ds.OdlegloscDs;
import pl.edu.pk.psb.bc.ds.PolaczenieDs;
import pl.edu.pk.psb.bc.ds.PrzystanekDs;
import pl.edu.pk.psb.bc.ds.RodzajPolaczeniaDs;

@Repository
public class PrzystanekDaoImpl extends GenericDaoImpl<PrzystanekDs> implements
		PrzystanekDao {
	public PrzystanekDaoImpl() {
		super(PrzystanekDs.class);
	}

	@Autowired
	private SessionFactory sessionFactory;

	@Autowired
	private OdlegloscDao odlegloscDao;
	
	@Autowired
	private CenaDao cenaDao;

	@SuppressWarnings("unchecked")
	public List<PrzystanekDs> pobierzPrzystanki(RodzajPolaczeniaDs polaczenie) {
		Criteria c = sessionFactory.getCurrentSession().createCriteria(
				PrzystanekDs.class);
		return c.add(Restrictions.eq("rodzajPrzystanku", polaczenie)).list();
	}

	@SuppressWarnings("unchecked")
	@Override
	public List<PrzystanekDs> pobierzListe(int idRodzajPolaczenia) {
		String query = "from PrzystanekDs as przyst where przyst.rodzajPrzystanku.id="
				+ idRodzajPolaczenia;
		Query q = sessionFactory.getCurrentSession().createQuery(query);

		return q.list();
	}

	@SuppressWarnings("unchecked")
	@Override
	public void zapisz(PrzystanekDs ds) {
		String query = "from MiastoDs as miasto where miasto.nazwa='"
				+ ds.getIdMiasta().getNazwa() + "'";
		Query q = sessionFactory.getCurrentSession().createQuery(query);
		List<MiastoDs> miasto = q.list();
		if (miasto.size() > 0) {
			MiastoDs m = miasto.get(0);
			ds.setIdMiasta(m);
		}
		sessionFactory.getCurrentSession().saveOrUpdate(ds);
	}

	@SuppressWarnings("unchecked")
	@Override
	public void usun(int id) {
		String query = "from OdlegloscDs as odl where przystanekPocz.id=" + id + "or przystanekKonc.id=" + id;
		Query q = sessionFactory.getCurrentSession().createQuery(query);
		List<OdlegloscDs> listaOdleglosci = (List<OdlegloscDs>) q.list();
		for (OdlegloscDs odl : listaOdleglosci) {
			odlegloscDao.usun(odl);
		}
		
		query = "from CenaDs as cena where przystanekPocz.id=" + id + "or przystanekKonc.id=" + id;
		q = sessionFactory.getCurrentSession().createQuery(query);
		List<CenaDs> cennik = (List<CenaDs>) q.list();
		for (CenaDs c : cennik) {
			cenaDao.usun(c);
		}
		
		PrzystanekDs ds = (PrzystanekDs)sessionFactory.getCurrentSession().get(PrzystanekDs.class, id);
		sessionFactory.getCurrentSession().flush();
		ds.setIdMiasta(null);
		super.usun(ds);
	}
}
